/**
 * SRT字幕解析器
 * 用于解析SRT格式的字幕文件
 */

/**
 * 解析SRT格式的字幕文本
 * @param {string} srtText - SRT格式的字幕文本
 * @returns {Array} 解析后的字幕对象数组
 */
export function parseSRT(srtText) {
  if (!srtText || typeof srtText !== 'string') {
    return [];
  }
  
  const cues = [];
  const lines = srtText.split('\n');
  let index = 0;
  let currentCue = null;
  
  while (index < lines.length) {
    // 跳过空行
    while (index < lines.length && lines[index].trim() === '') {
      index++;
    }
    
    if (index >= lines.length) break;
    
    // 创建新的字幕对象
    currentCue = {
      startTime: 0,
      endTime: 0,
      text: ''
    };
    
    // 跳过序号行（如果存在）
    if (/^\d+$/.test(lines[index].trim())) {
      index++;
    }
    
    // 解析时间行
    if (index < lines.length) {
      const timeLine = lines[index].trim();
      const timeMatch = timeLine.match(/^(\d{2}:\d{2}:\d{2},\d{3})\s*-->\s*(\d{2}:\d{2}:\d{2},\d{3})/);
      
      if (timeMatch) {
        currentCue.startTime = timeToSeconds(timeMatch[1]);
        currentCue.endTime = timeToSeconds(timeMatch[2]);
        index++;
        
        // 解析文本内容
        let textLines = [];
        while (index < lines.length && lines[index].trim() !== '') {
          textLines.push(lines[index].trim());
          index++;
        }
        
        currentCue.text = textLines.join('\n');
        
        // 添加到结果数组
        if (currentCue.text) {
          cues.push(currentCue);
        }
      } else {
        // 如果时间行格式不正确，跳过
        index++;
      }
    }
  }
  
  return cues;
}

/**
 * 将SRT时间格式转换为秒数
 * @param {string} timeStr - SRT时间格式字符串（如 "00:01:23,456"）
 * @returns {number} 转换后的秒数
 */
function timeToSeconds(timeStr) {
  const parts = timeStr.split(':');
  if (parts.length !== 3) {
    return 0;
  }
  
  const hours = parseInt(parts[0], 10);
  const minutes = parseInt(parts[1], 10);
  
  // 处理毫秒部分
  const secAndMs = parts[2].split(',');
  const seconds = parseInt(secAndMs[0], 10);
  const milliseconds = parseInt(secAndMs[1] || '0', 10);
  
  return hours * 3600 + minutes * 60 + seconds + milliseconds / 1000;
}

/**
 * 将秒数转换为SRT时间格式
 * @param {number} seconds - 秒数
 * @returns {string} SRT时间格式字符串
 */
export function secondsToTime(seconds) {
  const hours = Math.floor(seconds / 3600);
  const minutes = Math.floor((seconds % 3600) / 60);
  const secs = Math.floor(seconds % 60);
  const milliseconds = Math.round((seconds % 1) * 1000);
  
  return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')},${milliseconds.toString().padStart(3, '0')}`;
}

/**
 * 根据当前时间获取应该显示的字幕
 * @param {Array} cues - 字幕数组
 * @param {number} currentTime - 当前时间（秒）
 * @returns {Object|null} 当前应该显示的字幕对象，如果没有则返回null
 */
export function getCueByTime(cues, currentTime) {
  if (!Array.isArray(cues)) {
    return null;
  }
  
  for (let i = 0; i < cues.length; i++) {
    if (currentTime >= cues[i].startTime && currentTime <= cues[i].endTime) {
      return cues[i];
    }
  }
  
  return null;
}

/**
 * 异步加载并解析SRT字幕文件
 * @param {string} url - SRT文件的URL
 * @returns {Promise<Array>} 解析后的字幕数组
 */
export async function loadSRT(url) {
  try {
    const response = await fetch(url);
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }
    const srtText = await response.text();
    return parseSRT(srtText);
  } catch (error) {
    console.error('Error loading SRT file:', error);
    return [];
  }
}